package demo.ht.com.basequickadpater.utils;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.AbsoluteSizeSpan;
import android.text.style.BackgroundColorSpan;
import android.text.style.ForegroundColorSpan;
import android.text.style.ImageSpan;
import android.text.style.ScaleXSpan;
import android.text.style.StyleSpan;
import android.util.AttributeSet;

import demo.ht.com.basequickadpater.rich.rich.VerticalAlignTextSpan;

/**
 * @ClassName: RichTextView
 * @Author: szj
 * @CreateDate: 6/29/21 4:13 PM
 * @UpdateRemark: 富文本:RichTextView
 * @Version: 1.0
 * 掘金地址主页: https://juejin.cn/user/2251439606079277
 */
public class RichTextView extends androidx.appcompat.widget.AppCompatTextView {
    public RichTextView(Context context) {
        super(context);
    }

    public RichTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    /**
     * 添加图片
     *
     * @param drawable 图片url路径
     */
    @SuppressLint("UseCompatLoadingForDrawables")
    public void addImage(int drawable) {
        //得到drawable对象，即所要插入的图片
        Drawable d = getResources().getDrawable(drawable);
        d.setBounds(5, 5, d.getIntrinsicWidth(), d.getIntrinsicHeight());
        ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
        buildSpannableString(span, "image");
    }

    /**
     * 添加文字
     *
     * @param text 文字内容
     */
    public void addText(String text) {
        append(text);
    }

    /**
     * 添加文字图片居中
     *
     * @param title    文字
     * @param drawable 图片
     */
    @SuppressLint("UseCompatLoadingForDrawables")
    public void addTextImage(String title, int drawable) {
        //得到drawable对象，即所要插入的图片
        Drawable d = getResources().getDrawable(drawable);
        d.setBounds(5, 5, d.getIntrinsicWidth(), d.getIntrinsicHeight());
        ImageSpan imageSpan = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
        VerticalAlignTextSpan textSpan = new VerticalAlignTextSpan();
        buildSpannableString(textSpan, title);
        buildSpannableString(imageSpan, "image");
    }

    /**
     * 添加图片文字居中
     *
     * @param drawable 图片
     * @param title    文字
     */
    @SuppressLint("UseCompatLoadingForDrawables")
    public void addImageText(int drawable, String title) {
        //得到drawable对象，即所要插入的图片
        Drawable d = getResources().getDrawable(drawable);
        d.setBounds(5, 5, d.getIntrinsicWidth(), d.getIntrinsicHeight());
        ImageSpan imageSpan = new ImageSpan(d, ImageSpan.ALIGN_BOTTOM);
        VerticalAlignTextSpan textSpan = new VerticalAlignTextSpan();
        buildSpannableString(imageSpan, "image");
        buildSpannableString(textSpan, title);
    }

    /**
     * 设置文字大小
     *
     * @param size 文字大小
     */
    public void setTextSize(int size, String title) {
        AbsoluteSizeSpan span = new AbsoluteSizeSpan(size);
        buildSpannableString(span, title);
    }

    /**
     * 设置文字大小(倍率放大)
     *
     * @param size 文字大小
     */
    public void setTextSizeScale(float size, String title) {
        ScaleXSpan span = new ScaleXSpan(size);
        buildSpannableString(span, title);
    }

    /**
     * 设置字体加粗
     *
     * @parm title 字体加粗文字
     */
    public void setStyleSpan(String title) {
        StyleSpan span = new StyleSpan(Typeface.BOLD_ITALIC);//加粗
        buildSpannableString(span, title);
    }

    /**
     * 文字背景颜色
     *
     * @parm color 颜色
     * @parm title 文字
     */
    public void setBackColor(int color, String title) {
        BackgroundColorSpan span = new BackgroundColorSpan(color);
        buildSpannableString(span, title);
    }

    /**
     * 文字字体颜色
     *
     * @parm color 颜色
     * @parm title 文字
     */
    public void setTextColor(int color, String title) {
        ForegroundColorSpan span = new ForegroundColorSpan(color);
        buildSpannableString(span, title);
    }

    /**
     * 自定义属性
     *
     * @param title   需要添加的文字
     * @param objects 自定义属性
     *                <p>
     *                文字颜色  ForegroundColorSpan(Color)
     *                背景颜色  BackgroundColorSpan(Color)
     *                加粗     StyleSpan(Typeface.BOLD_ITALIC)
     *                文字大小  AbsoluteSizeSpan(int)
     *                <p>
     *                图片:
     *                val d = resources.getDrawable(R.drawable.crop__ic_cancel)
     *                d.setBounds(5, 5, d.intrinsicWidth, d.intrinsicHeight)
     *                val imageSpan = ImageSpan(d, ImageSpan.ALIGN_BOTTOM)
     *                <p>
     *                更多字段参考: https://blog.csdn.net/u010983881/article/details/53995020
     */
    public void ObjectSpannableString(String title, Object... objects) {
        SpannableString ss = new SpannableString(title);
        for (Object object : objects) {
            ss.setSpan(object, 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
        append(ss);
    }

    public void buildSpannableString(Object span, String title) {
        SpannableString ss = new SpannableString(title);
        ss.setSpan(span, 0, title.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        append(ss);
    }
}